/*
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package org.apache.tomcat.util.net;

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

/**
 * 
 */
public class TcpConnection { // implements Endpoint {
	/**
	 * Maxium number of times to clear the socket input buffer.
	 */
	static int MAX_SHUTDOWN_TRIES = 20;

	public TcpConnection() {
	}

	// -------------------- Properties --------------------

	PoolTcpEndpoint endpoint;
	Socket socket;

	public static void setMaxShutdownTries(int mst) {
		MAX_SHUTDOWN_TRIES = mst;
	}

	public void setEndpoint(PoolTcpEndpoint endpoint) {
		this.endpoint = endpoint;
	}

	public PoolTcpEndpoint getEndpoint() {
		return endpoint;
	}

	public void setSocket(Socket socket) {
		this.socket = socket;
	}

	public Socket getSocket() {
		return socket;
	}

	public void recycle() {
		endpoint = null;
		socket = null;
	}

	// Another frequent repetition
	public static int readLine(InputStream in, byte[] b, int off, int len)
			throws IOException {
		if (len <= 0) {
			return 0;
		}
		int count = 0, c;

		while ((c = in.read()) != -1) {
			b[off++] = (byte) c;
			count++;
			if (c == '\n' || count == len) {
				break;
			}
		}
		return count > 0 ? count : -1;
	}

	// Usefull stuff - avoid having it replicated everywhere
	public static void shutdownInput(Socket socket) throws IOException {
		try {
			InputStream is = socket.getInputStream();
			int available = is.available();
			int count = 0;

			// XXX on JDK 1.3 just socket.shutdownInput () which
			// was added just to deal with such issues.

			// skip any unread (bogus) bytes
			while (available > 0 && count++ < MAX_SHUTDOWN_TRIES) {
				is.skip(available);
				available = is.available();
			}
		} catch (NullPointerException npe) {
			// do nothing - we are just cleaning up, this is
			// a workaround for Netscape \n\r in POST - it is supposed
			// to be ignored
		}
	}
}
